package main

import (
	"errors"
	"fmt"
)

// go 语言操作指针的 &取地址 *指针类型
// go 语言的函数参数是值拷贝，完全拷贝一份

// 比特币数量，int 的类型别名
type Bitcoin int

// 这个接口是在 fmt 包中定义的。
// 当使用 %s 打印格式化的字符串时，你可以定义此类型的打印方式。
// 重写了 fmt 中 %s 的输出方式
func (b Bitcoin) String() string {
	return fmt.Sprintf("%d BTC", b)
}

// 比特币钱包类型
type Wallet struct {
	balance Bitcoin
}

// 向钱包中增加
func (w *Wallet) Deposit(amount Bitcoin) {
	w.balance += amount
}

// ErrInsufficientFunds means a wallet does not have enough Bitcoin to perform a withdraw.
var ErrInsufficientFunds = errors.New("cannot withdraw, insufficient funds")

// 在钱包中减少
func (w *Wallet) Withdraw(amount Bitcoin) error {

	if amount > w.balance {
		return ErrInsufficientFunds
	}

	w.balance -= amount
	return nil
}

// Balance returns the number of Bitcoin a wallet has.
func (w *Wallet) Balance() Bitcoin {
	return w.balance
}

func deposit() {
	wallet := Wallet{}
	wallet.Deposit(Bitcoin(10))
	got := wallet.Balance()
	want := Bitcoin(10)
	if got != want {
		fmt.Printf("got %s want %s", got, want)
	}
}

func withdraw() {
	wallet := Wallet{balance: Bitcoin(20)}
	wallet.Withdraw(10)
	got := wallet.Balance()
	want := Bitcoin(10)
	if got != want {
		fmt.Printf("got %s want %s", got, want)
	}
}

//func test() {
//	a := 10
//	a_addr := &a // *int (int 指针)
//	// %v 变量真实值
//	// %p 变量内存地址
//
//	//	指针取值，指针指向的值是
//	var c = *a_addr
//
//	//	指针传值示例
//}

func test2(x *int) {
	*x = 100
}

func main() {
	deposit()
	withdraw()
	a := 200
	test2(&a)
	fmt.Println(a)
}
